2010-11-18 23 views
6

gì tôi có Object:sự khác biệt giữa thiết lập một đối tượng để nil vs gửi nó nhắn phát hành trong dealloc

MyClass *obj= [[MyClass alloc] init]; 

sự khác biệt giữa là gì:

[obj release]; // Only obj own this object. 

và:

obj = nil; 

iOS deallocs obj khi tôi đặt obj = nil?

Tôi có một con trỏ, đôi khi tôi đặt nó trỏ đến một đối tượng, đôi khi không. Vì vậy, khi tôi muốn phát hành một con trỏ tôi phải kiểm tra là nó nil?

Trả lời

13

Câu trả lời này từ thập kỷ trước,

hiện chỉ là sở thích lịch sử.

Hôm nay, bạn phải sử dụng ARC.

Cheers


Câu trả lời rất ngắn gọn là KHÔNG chỉ cần đặt nó để nil. Bạn phải phát hành nó. Đặt nó thành không có kết nối để phát hành nó. Bạn phải giải phóng nó.

Tuy nhiên nó có giá trị ghi nhớ rằng nếu nó là một tài sản, sau đó

self.obj = nil; 

sẽ trong một thực tế phát hành nó cho bạn. Tất nhiên, bạn không được quên "bản ngã". phần !!!!

Thật vậy,

self.obj = anyNewValue; 

thực sự sẽ giải phóng bộ nhớ cũ cho bạn, tất cả mọi thứ sạch lên một cách kỳ diệu và thiết lập nó với các giá trị mới. Vì vậy, self.obj = nil chỉ là một trường hợp đặc biệt, nó giải phóng và làm sạch mọi thứ và sau đó chỉ để nó ở nil.

Vì vậy, nếu có ai đọc bài viết này là mới và hoàn toàn bối rối bởi bộ nhớ,

  1. Bạn phải giải phóng nó, [x phát hành] trước khi đặt nó để nil x = nil

  2. NẾU bạn đang sử dụng thuộc tính "đừng quên tự". "

  3. IF bạn đang sử dụng thuộc tính, bạn chỉ có thể nói self.x = nil hoặc thực sự là sel f.x = somethingNew và nó sẽ chăm sóc phát hành và tất cả những thứ phức tạp gây phiền nhiễu khác.

  4. Cuối cùng, bạn sẽ phải tìm hiểu tất cả nội dung phức tạp về phát hành, tự động phát hành, blah blah blah. Nhưng cuộc sống ngắn ngủi, hãy quên nó đi bây giờ: -/

Hy vọng nó sẽ giúp ai đó.

Xin lưu ý, bài đăng này hiện đã hoàn toàn sai. Sử dụng ARC.

Chỉ có sở thích lịch sử.

+0

Các bit về tài sản được phát hành kỳ diệu không hoàn toàn đúng. Nếu bạn khai báo một thuộc tính với thuộc tính "giữ lại", bạn phải tự giải phóng nó, chỉ khi bạn khai báo nó với thuộc tính "copy" nó được phát hành cho bạn theo cách được mô tả. Xem http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocProperties.html – dertoni

+0

Tôi nghĩ rằng anh ấy có thể có nghĩa là "chỉ định", chứ không phải "giữ lại". Ngoài ra, sẽ không self.obj = someNewValue, kích hoạt người nghe KVO? –

+1

Để làm rõ, self.obj = newValue DOES giải phóng giá trị cũ, nếu bạn đang sử dụng các thuộc tính một cách chính xác. Tôi muốn thêm rằng self.obj = newValue giống hệt với [self setObj: newValue], đó là cách phát hành xảy ra (phương thức setObj chứa [oldValue release]). Ngoài ra, nếu bạn đang phát hành đối tượng, bạn sẽ không muốn KVO được kích hoạt? – andyvn22

5

iOS không hỗ trợ thu gom rác thải, có nghĩa là làm obj = nil sẽ dẫn đến rò rỉ bộ nhớ. Nếu bạn muốn điều khiển tự động trên deallocation, bạn nên làm một cái gì đó như: obj = [[[NSObject alloc] init] autorelease] (bạn phải NOT phát hành nó nếu bạn làm điều đó). Tự động hủy sẽ khiến đối tượng được tự động giải phóng khi sự kiện NSRunloop hiện tại kết thúc. NSRunloop tự động thoát khỏi NSAutoReleasePool cho mỗi sự kiện lặp lại, thường rất hữu ích.

+0

Tôi có một con trỏ, đôi khi tôi đặt i trỏ đến một đối tượng, đôi khi tôi không làm điều đó. Vì vậy, khi tôi muốn phát hành một con trỏ tôi phải kiểm tra là nó nil? –

+1

Tại sao bạn phải kiểm tra nil khi phát hành? Nó hoàn toàn hợp lệ trong mục tiêu-c để gửi một thông báo đến một con trỏ nil, nó không làm gì cả. Bạn nên luôn luôn khởi tạo con trỏ mặc dù, để nil hoặc một số đối tượng hợp lệ khác. – ImHuntingWabbits

+0

Tôi không hiểu tại sao bạn nên kiểm tra nil trước khi phát hành. Gửi bản phát hành đến nil là hoàn toàn hợp lệ và các lập trình viên không bắt đầu thực sự luôn làm việc đó. Tại sao tìm hiểu để tránh một cái gì đó được chấp nhận phổ biến thực hành? – andyvn22

2

Đặt đối tượng nil sẽ tạo rò rỉ bộ nhớ (nếu bạn đang sở hữu bằng cách phân bổ, giữ lại hoặc sao chép) vì chúng tôi không có con trỏ đến vị trí bộ nhớ cụ thể đó.

vì vậy nếu bạn muốn dealloc một đối tượng bạn phải đưa ra tất cả quyền sở hữu của một đối tượng trước khi làm cho nó không bằng cách gọi phương thức phát hành.

[obj release]; 
obj=nil; 
Các vấn đề liên quan