2010-10-17 25 views
7

Tôi có một truy vấn đơn giản mà tôi muốn xóa bởi một ai đó ... Có thực hành xấu để giữ lại bản thân không?Thực hành kém để giữ lại 'bản thân'?

Tôi có đối tượng yêu cầu máy chủ mà tôi muốn thực hiện. Tôi muốn để có thể sử dụng nó trong thời trang sau:

ARequest *request = [ARequest request: someParam]; 
request.delegate = self; 
[request begin]; 

Để cho đối tượng không tự hủy ngay sau khi các hồ bơi autorelease được để ráo nước, tôi tưởng tượng tôi cần phải gọi một giữ trong nó phương thức init và sau đó một bản phát hành sau khi phản hồi của máy chủ đã được nhận, xử lý và gửi đến đại biểu của nó.

Tuy nhiên, có điều gì đó đang làm tăng tiếng chuông cảnh báo trong đầu tôi bằng cách tiếp cận này. Cách tốt hơn để làm điều đó?

Trả lời

6

Không có gì sai khi giữ lại self, miễn là bạn phát hành nó tại một số điểm được xác định phù hợp với giao thức quản lý bộ nhớ thông thường. Nếu một đối tượng yêu cầu chính nó tồn tại cho đến khi một số điều kiện được đáp ứng, nó phải chịu trách nhiệm về điều đó, giống như cách đối với bất kỳ đối tượng nào khác mà nó yêu cầu để tiếp tục tồn tại.

Giới thiệu các đối tượng người quản lý không liên quan hoặc từ chối trách nhiệm đối với chủ sở hữu đối tượng vì lý do mê tín sẽ là mô hình chống thực sự ở đây.

(Cách tiếp cận tương đương trong mã thu gom rác sẽ cho các đối tượng để loại trừ bản thân từ thu gom rác thải trong khi kết quả được chờ giải quyết, hoặc rễ nó thông qua một bộ sưu tập của một số loại nếu bạn không thích ý tưởng đó.)

1

Cách dễ nhất để thực hiện việc này là tạo iVar cho yêu cầu của bạn, giữ lại yêu cầu khi bạn khởi động và phát hành nó khi phương thức đại biểu cuối cùng được gọi.

Có phải ARequest một lớp học bạn đã tạo không? Liệu nó có tạo ra một chuỗi mới để gửi yêu cầu không đồng bộ không?

+0

Vâng, ARequest về cơ bản là một lớp tạo ra một NSURLConnection để gửi một request một cách không đồng bộ. Tôi có thể sử dụng một ivar, nhưng tôi có thể có một vài yêu cầu được gửi cùng một lúc, vì vậy tôi phải duy trì một bộ sưu tập các yêu cầu. Apple dường như sử dụng một mô hình mà không yêu cầu duy trì loại này (SKProductsRequest ví dụ) tuy nhiên. – Tricky

0

Tôi đã từng làm điều tương tự như bạn. Tôi đã viết một Thể loại-Phương pháp về NSString để gửi nó đến một máy chủ, mà sẽ in nó. Trong Category-Method tôi đã gọi [self retain], để các phương thức gọi lại có thể là một NSString-Categroy-Method.
Tôi cảm thấy rất tệ về điều đó, rằng tôi đã viết lại mọi thứ để sử dụng Singleton, được truy cập bởi Danh mục Phương pháp. Vì vậy, Singleton sẽ giữ lại chuỗi miễn là cần thiết.

+0

Vâng, đó là điều ... Nó cảm thấy 'xấu' vì lý do nào đó, nhưng tôi tự hỏi nếu nó thực sự là? Apple quản lý điều này bằng cách nào đó trong SKProductsRequest ví dụ, nhưng là nó thông qua một [tự giữ lại] hoặc họ duy trì một bộ sưu tập các yêu cầu xuất sắc ở đâu đó? – Tricky

2

Nó không phải là chưa từng nghe, nhưng nó có phần không phổ biến. Cách chính tôi đã nhìn thấy nó được sử dụng (và sử dụng nó bản thân mình) là khi bạn đang đối phó với một số loại đối tượng bán đồng bộ (bằng bán đồng bộ tôi có nghĩa là nó không chặn các chủ đề chính, nhưng nó cũng không thực hiện trên một chủ đề nền; một NSURLConnection sẽ phù hợp với hóa đơn này). Ví dụ, tôi đã viết một lớp con của NSWindowController được dành riêng để hiển thị một cửa sổ dưới dạng trang tính và để gọi một số cuộc gọi lại đại biểu nhất định. Về cơ bản, bạn cần alloc/init bộ điều khiển trang tính mới và gọi beginSheetForWindow:. Điều này sẽ chạy bảng bán đồng bộ, và sau đó gọi một cuộc gọi lại thích hợp khi trang tính bị loại bỏ.

Vì đối tượng gọi không nhất thiết phải "sở hữu" trang tính (coi đó là phiên bản Mac của bộ điều khiển chế độ xem trên iOS), trình điều khiển trang tính hiện [self retain] ngay trước khi hiển thị trang tính và [self release] ngay sau khi làm sạch và gọi lại các cuộc gọi lại. Mục đích đằng sau điều này là để đảm bảo rằng đối tượng điều khiển sẽ dính xung quanh cho đến khi trang tính được hoàn thành. (Tờ giấy, IIRC, được giữ lại bởi runloop, nhưng tôi cũng cần bộ điều khiển để dán xung quanh)

Như tôi đã nói, rất hiếm khi xảy ra tình huống mà bạn muốn [self retain], nhưng không phải là không thể. Tuy nhiên, theo nguyên tắc chung, nếu bạn nghĩ rằng bạn cần phải [self retain], bạn có thể muốn suy nghĩ lại.

Các vấn đề liên quan