Create an account

Very important

  • To access the important data of the forums, you must be active in each forum and especially in the leaks and database leaks section, send data and after sending the data and activity, data and important content will be opened and visible for you.
  • You will only see chat messages from people who are at or below your level.
  • More than 500,000 database leaks and millions of account leaks are waiting for you, so access and view with more activity.
  • Many important data are inactive and inaccessible for you, so open them with activity. (This will be done automatically)


Thread Rating:
  • 330 Vote(s) - 3.53 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Differences between strong and weak in Objective-C

#1
What are the differences between `strong` and `weak` in `@property` declarations of pointers to objects?

Also, what does `nonatomic` mean?
Reply

#2
**strong**: assigns the incoming value to it, it will retain the incoming value and release the existing value of the instance variable

**weak**: will assign the incoming value to it without retaining it.

So the basic difference is the retaining of the new variable.
Generaly you want to retain it but there are situations where you don't want to have it otherwise you will get a retain cycle and can not free the memory the objects. Eg. obj1 retains obj2 and obj2 retains obj1. To solve this kind of situation you use weak references.
Reply

#3
Here, **Apple Documentation** has explained the difference between weak and strong property using various examples :

[To see links please register here]


Here, In this blog author has collected all the properties in same place. It will help to compare properties characteristics :

[To see links please register here]

Reply

#4
**strong** is the default. An object remains “alive” as long as there is a strong pointer to it.

**weak** specifies a reference that does not keep the referenced object alive. A weak reference is set to nil when there are no strong references to the object.
Reply

#5
It may be helpful to think about strong and weak references in terms of balloons.

A balloon will not fly away as long as at least one person is holding on to a string attached to it. The number of people holding strings is the retain count. When no one is holding on to a string, the ballon will fly away (dealloc). Many people can have strings to that same balloon. You can get/set properties and call methods on the referenced object with both strong and weak references.

A strong reference is like holding on to a string to that balloon. As long as you are holding on to a string attached to the balloon, it will not fly away.

A weak reference is like looking at the balloon. You can see it, access it's properties, call it's methods, but you have no string to that balloon. If everyone holding onto the string lets go, the balloon flies away, and you cannot access it anymore.
Reply

#6
A strong reference (which you will use in most cases) means that you want to "own" the object you are referencing with this property/variable. The compiler will take care that any object that you assign to this property will not be destroyed as long as you point to it with a strong reference. Only once you set the property to `nil` will the object get destroyed (unless one or more other objects also hold a strong reference to it).

In contrast, with a weak reference you signify that you don't want to have control over the object's lifetime. The object you are referencing weakly only lives on because at least one other object holds a strong reference to it. Once that is no longer the case, the object gets destroyed and your weak property will automatically get set to `nil`. The most frequent use cases of weak references in iOS are:

1. delegate properties, which are often referenced weakly to avoid retain cycles, and

2. subviews/controls of a view controller's main view because those views are already strongly held by the main view.

atomic vs. nonatomic refers to the thread safety of the getter and setter methods that the compiler synthesizes for the property. atomic (the default) tells the compiler to make the accessor methods thread-safe (by adding a lock before an ivar is accessed) and nonatomic does the opposite. The advantage of nonatomic is slightly higher performance. On iOS, Apple uses nonatomic for almost all their properties so the general advice is for you to do the same.
Reply

#7
**A dummy answer :-**

I think explanation is given in above answer, so i am just gonna tell you where to use **`STRONG`** and where to use **`WEAK` :**

**Use of `Weak` :-**
1. Delegates
2. Outlets
3. Subviews
4. Controls, etc.

**Use of `Strong` :-**
Remaining everywhere which is not included in **`WEAK`**.
Reply

#8
**strong** and **weak**, these keywords revolves around **Object Ownership** in Objective-C

**What is object ownership ?**

Pointer variables imply ownership of the objects that they point to.

- When a method (or function) has a local variable that points to an object, that variable is said to own the object being pointed to.
- When an object has an instance variable that points to another object, the object with the pointer is said to own the object being pointed to.

Anytime a pointer variable points to an object, that object has an owner and will stay alive. This is known as a **strong** reference.

A variable can optionally not take ownership of an object that it points to. A variable that does not take ownership of an object is known as a **weak** reference.

Have a look for a detailed explanation here [Demystifying @property and attributes](

[To see links please register here]

)
Reply

#9
To understand Strong and Weak reference consider below example, suppose we have method named as displayLocalVariable.

-(void)displayLocalVariable
{
UIView* myView = [[UIView alloc] init];
NSLog(@"myView tag is = %ld", myView.tag);
}

In above method scope of myView variable is limited to displayLocalVariable method, once the method gets finished myView variable which is holding the UIView object will get deallocated from the memory.

Now what if we want to hold the myView variable throughout our view controller's life cycle. For this we can create the property named as usernameView which will have Strong reference to the variable myView(see `@property(nonatomic,strong) UIView* usernameView;` and `self.usernameView = myView;` in below code), as below,

@interface LoginViewController ()

@property(nonatomic,strong) UIView* usernameView;
@property(nonatomic,weak) UIView* dummyNameView;

- (void)displayLocalVariable;

@end

@implementation LoginViewController

- (void)viewDidLoad
{
[super viewDidLoad];

}

-(void)viewWillAppear:(BOOL)animated
{
[self displayLocalVariable];
}

- (void)displayLocalVariable
{
UIView* myView = [[UIView alloc] init];
NSLog(@"myView tag is = %ld", myView.tag);
self.usernameView = myView;
}

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}


@end

Now in above code you can see myView has been assigned to self.usernameView and self.usernameView is having a strong reference(as we declared in interface using @property) to myView. Hence myView will not get deallocated from memory till self.usernameView is alive.

- Weak reference


Now consider assigning myName to dummyNameView which is a Weak reference, `self.dummyNameView = myView;` Unlike Strong reference Weak will hold the myView only till there is Strong reference to myView. See below code to understand Weak reference,

-(void)displayLocalVariable
{
UIView* myView = [[UIView alloc] init];
NSLog(@"myView tag is = %ld", myView.tag);
self.dummyNameView = myView;
}

In above code there is Weak reference to myView(i.e. self.dummyNameView is having Weak reference to myView) but there is no Strong reference to myView, hence self.dummyNameView will not be able to hold the myView value.

Now again consider the below code,

-(void)displayLocalVariable
{
UIView* myView = [[UIView alloc] init];
NSLog(@"myView tag is = %ld", myView.tag);
self.usernameView = myView;
self.dummyNameView = myView;
}

In above code self.usernameView has a Strong reference to myView, hence self.dummyNameView will now have a value of myView even after method ends since myView has a Strong reference associated with it.

Now whenever we make a Strong reference to a variable it's retain count get increased by one and the variable will not get deallocated till it's retain count reaches to 0.

Hope this helps.

Reply

#10
**Strong**: Basically Used With Properties we used to get or send data from/into another classes.
**Weak**: Usually all outlets, connections are of Weak type from Interface.

**Atomic**: Such type of properties are used in conditions when we don't want to share our outlet or object into different simultaneous Threads. In other words, Atomic instance make our properties to deal with one thread at a time.
Hopefully it helpful for you.

Reply



Forum Jump:


Users browsing this thread:
1 Guest(s)

©0Day  2016 - 2023 | All Rights Reserved.  Made with    for the community. Connected through